package com.cgnpc.scp.common.utils;

import com.cgnpc.cud.core.domain.AjaxResult;
import org.springframework.context.MessageSource;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Locale;

/**
 * AjaxResult的工具类
 *
 * @see AjaxResult#message(String, String)
 * @see com.cgnpc.cud.core.controller.BaseController
 */
public class AjaxResultUtil {

    public static final String KEY_CODE = "code";

    public static final String KEY_MSG = "msg";

    public static final String KEY_DATA = "data";

    public static final String DEFAULT_SUCCESS_KEY = "scp.success";

    public static final String DEFAULT_ERROR_KEY = "scp.error";

    public static final String I18N_KEY_MESSAGE_SCP_MESSAGE = "message.scp.message";

    public static final String I18N_KEY_MESSAGE_SCP_SUCCESS = "message.scp.success";

    public static final String I18N_KEY_MESSAGE_SCP_ERROR = "message.scp.error";

    /**
     * 成功
     */
    public static final String VALUE_CODE_SUCCESS = "0";

    /**
     * 失败
     */
    public static final String VALUE_CODE_ERROR = "1";

    public static AjaxResult createMessage(String code, String msg, Object data) {
        AjaxResult result = AjaxResult.message(code, msg);
        result.put(KEY_DATA, data);
        return result;
    }

    public static AjaxResult createMessage(String code, String msg) {
        AjaxResult result = AjaxResult.message(code, msg);
        return result;
    }

    public static AjaxResult createSuccessMessage() {
        return AjaxResult.success();
    }

    public static AjaxResult createSuccessMessage(Object data) {
        AjaxResult result = AjaxResult.success();
        result.put(KEY_DATA, data);
        return result;
    }

    public static AjaxResult createSuccessMessage(String msg) {
        AjaxResult result = AjaxResult.success();
        result.put(KEY_MSG, msg);
        return result;
    }

    public static AjaxResult createSuccessMessage(String msg, Object data) {
        AjaxResult result = AjaxResult.success();
        result.put(KEY_MSG, msg);
        result.put(KEY_DATA, data);
        return result;
    }

    public static AjaxResult createErrorMessage(String msg, Object data) {
        AjaxResult result = AjaxResult.error(msg);
        result.put(KEY_DATA, data);
        return result;
    }

    public static AjaxResult createErrorMessage(String msg) {
        AjaxResult result = AjaxResult.error(msg);
        return result;
    }

    public static AjaxResult createErrorMessage() {
        return createMessage(VALUE_CODE_ERROR, "操作失败");
    }

    public static AjaxResult createI18nDefaultSuccess(HttpServletRequest request, MessageSource messageSource) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(DEFAULT_SUCCESS_KEY, null, reqLocale);
        AjaxResult result = AjaxResult.message(VALUE_CODE_SUCCESS, strMessage);
        return result;
    }

    public static AjaxResult createI18nDefaultSuccess(HttpServletRequest request, MessageSource messageSource, Object data) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(DEFAULT_SUCCESS_KEY, null, reqLocale);
        AjaxResult result = AjaxResult.message(VALUE_CODE_SUCCESS, strMessage);
        result.put(KEY_DATA, data);
        return result;
    }

    public static AjaxResult createI18nDefaultError(HttpServletRequest request, MessageSource messageSource) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(DEFAULT_SUCCESS_KEY, null, reqLocale);
        AjaxResult result = AjaxResult.message(VALUE_CODE_ERROR, strMessage);
        return result;
    }

    public static AjaxResult createI18nDefaultError(HttpServletRequest request, MessageSource messageSource, Object data) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(DEFAULT_ERROR_KEY, null, reqLocale);
        AjaxResult result = AjaxResult.message(VALUE_CODE_ERROR, strMessage);
        result.put(KEY_DATA, data);
        return result;
    }

    /**
     * 创建I18N信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultCode ajaxResultCode；值0成功；1失败；
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            String ajaxResultCode,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.message(ajaxResultCode, strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.success(strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessDefaultMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            Object ajaxResultData
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_SUCCESS;
        Object[] i18nValues = null;
        return createI18nSuccessMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param request       request
     * @param messageSource messageSource
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessDefaultMessage(
            HttpServletRequest request,
            MessageSource messageSource
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_SUCCESS;
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nSuccessMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultData 返回值data的数据
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.error(strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request       request
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @param i18nValues    i18n的值，会按照顺序填充，下标从0开始
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues
    ) {
        Object ajaxResultData = null;
        return createI18nErrorMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request       request
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            String i18nKey
    ) {
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nErrorMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultData 返回值data的数据
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorDefaultMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            Object[] i18nValues,
            Object ajaxResultData
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_ERROR;
        return createI18nErrorMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request        request
     * @param messageSource  messageSource
     * @param ajaxResultData 返回值data的数据
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorDefaultMessage(
            HttpServletRequest request,
            MessageSource messageSource,
            Object ajaxResultData
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_ERROR;
        Object[] i18nValues = null;
        return createI18nErrorMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param request       request
     * @param messageSource messageSource
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorDefaultMessage(
            HttpServletRequest request,
            MessageSource messageSource
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_ERROR;
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nErrorMessage(request, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息
     *
     * @param reqLocale      获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultCode ajaxResultCode；值0成功；1失败；
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            String ajaxResultCode,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        // Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.message(ajaxResultCode, strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param reqLocale      获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        // Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.success(strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @param i18nValues    i18n的值，会按照顺序填充，下标从0开始
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues
    ) {
        Object ajaxResultData = null;
        return createI18nSuccessMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey
    ) {
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nSuccessMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param reqLocale      获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource  messageSource
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessDefaultMessage(
            Locale reqLocale,
            MessageSource messageSource,
            Object ajaxResultData
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_SUCCESS;
        Object[] i18nValues = null;
        return createI18nSuccessMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，成功信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @return AjaxResult
     */
    public static AjaxResult createI18nSuccessDefaultMessage(
            Locale reqLocale,
            MessageSource messageSource
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_SUCCESS;
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nSuccessMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param reqLocale      获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource  messageSource
     * @param i18nKey        i18nKey
     * @param i18nValues     i18n的值，会按照顺序填充，下标从0开始
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues,
            Object ajaxResultData
    ) {
        // 获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
        // Locale reqLocale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
        // 获取对应语言的返回值
        String strMessage = messageSource.getMessage(
                i18nKey != null ? i18nKey : I18N_KEY_MESSAGE_SCP_MESSAGE,
                i18nValues,
                reqLocale
        );
        AjaxResult result = AjaxResult.error(strMessage);
        result.put(KEY_DATA, ajaxResultData);
        return result;
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @param i18nValues    i18n的值，会按照顺序填充，下标从0开始
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey,
            Object[] i18nValues
    ) {
        Object ajaxResultData = null;
        return createI18nErrorMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @param i18nKey       i18nKey
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorMessage(
            Locale reqLocale,
            MessageSource messageSource,
            String i18nKey
    ) {
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nErrorMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param reqLocale      获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource  messageSource
     * @param ajaxResultData ajaxResultData
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorDefaultMessage(
            Locale reqLocale,
            MessageSource messageSource,
            Object ajaxResultData
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_ERROR;
        Object[] i18nValues = null;
        return createI18nErrorMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

    /**
     * 创建I18N信息，错误信息
     *
     * @param reqLocale     获取请求的语言reqLocale，cookie需要包含lang=cn，或者lang=en
     * @param messageSource messageSource
     * @return AjaxResult
     */
    public static AjaxResult createI18nErrorDefaultMessage(
            Locale reqLocale,
            MessageSource messageSource
    ) {
        String i18nKey = I18N_KEY_MESSAGE_SCP_ERROR;
        Object[] i18nValues = null;
        Object ajaxResultData = null;
        return createI18nErrorMessage(reqLocale, messageSource, i18nKey, i18nValues, ajaxResultData);
    }

}
